package 简单.字符串;

/**
 * 给你一个仅包含小写英文字母和 '?' 字符的字符串 s，请你将所有的 '?'
 * 转换为若干小写字母，使最终的字符串不包含任何 连续重复 的字符。
 * <p>
 * 注意：你 不能 修改非 '?' 字符。
 * <p>
 * 题目测试用例保证 除 '?' 字符 之外，不存在连续重复的字符。
 * <p>
 * 在完成所有转换（可能无需转换）后返回最终的字符串。如果有多个解决方案
 * ，请返回其中任何一个。可以证明，在给定的约束条件下，答案总是存在的。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/replace-all-s-to-avoid-consecutive-repeating-characters
 */
public class 替换所有的问号_1576 {

    public static void main(String[] args) {

        String string = "??yw?ipkj?";
        System.out.println(efficientModifyString(string));
        System.out.println((int) '?');

    }

    /**
     * ?位置的只与左右两边的元素有关，给定a,b,c,替换?必定有一个符合条件
     *
     * @param s
     * @return
     */
    public static String efficientModifyString(String s) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '?') {  //待替换元素
                for (char j = 'a'; j <= 'c'; j++) {
                    //注意边界情况，短路运算
                    if ((i == s.length() - 1 || s.charAt(i + 1) != j) && (i == 0 || builder.charAt(i - 1) != j)) {
                        builder.append(j);
                        break;
                    }
                }
                continue;
            }
            builder.append(s.charAt(i));
        }
        return builder.toString();
    }

    /**
     * a-z对应97-122
     *
     * @param s
     * @return
     */
    public static String modifyString(String s) {
        if (s.length() == 1 && s.charAt(0) == '?') {
            return "a";
        }
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '?') {
                if (i == 0 || (i + 1 < s.length() && s.charAt(i + 1) == '?')) {
                    int c = s.charAt(i + 1);  //右边元素
                    if (i != 0) {
                        if (builder.charAt(i - 1) + 1 <= 122) {
                            builder.append((char) (builder.charAt(i - 1) + 1));
                        } else {
                            builder.append((char) (builder.charAt(i - 1) - 1));
                        }
                    } else {
                        if (i + 1 < s.length() && s.charAt(i + 1) == '?') {  //不用考虑右边元素的情况
                            builder.append('a');
                            continue;
                        }
                        if (c + 1 <= 122) {
                            builder.append((char) (c + 1));
                        } else {
                            builder.append((char) (c - 1));
                        }
                    }
                } else if (i == s.length() - 1) {
                    int c = builder.charAt(i - 1);
                    if (c + 1 <= 122) {
                        builder.append((char) (c + 1));
                    } else {
                        builder.append((char) (c - 1));
                    }
                } else {
                    int after = s.charAt(i + 1);
                    int before = builder.charAt(i - 1);
                    if (Math.min(after, before) - 1 >= 97) {
                        builder.append((char) (Math.min(after, before) - 1));
                    } else if (Math.max(after, before) + 1 <= 122) {
                        builder.append((char) (Math.max(after, before) + 1));
                    } else {
                        builder.append((char) (Math.min(after, before) + 1));
                    }
                }
            } else {
                builder.append(s.charAt(i));
            }
        }
        return builder.toString();
    }

}
